package java_thinking.unit_21._21_15;

import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

/**
 * @Desc:   15.8 原子的域更新器在 ConcurrentLinkedQueue 中的使用 它并不是用原子引用来表示每个 Node
 * @author: cww
 * @DateTime: 2019-06-30 14:57
 */

public class ConcurrentLinkedQueueUseFiledUpdater<E> {

    private static class Node<E> {
        private final E item;
        /**
         * 使用普通的 volatile 类引用，通过基于反射的 AtomicReferenceFieldUpdater 来进行更新
         */
        private volatile Node<E> next;

        public Node(E item) {
            this.item = item;
        }
    }

    /**
     */
    private static AtomicReferenceFieldUpdater<Node, Node> nextUpdater
            = AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "next");

    public void put(E expect, E item) {
        Node<E> oldNode = new Node<>(null);
        nextUpdater.compareAndSet(oldNode, oldNode.next, (Node) item);
    }
}
